package com.info.zhiduoduo.common.utils;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.util.List;

public class NumberUtil {

	/**
	 * 使用BigDecimal格式化float小数点位数. 四舍五入的方式
	 *
	 * @param value
	 * @param scale 保留的小数点位数
	 * @return
	 */
	public static float formatFloatRoundup(float value, int scale) {
		float result = BigDecimal.valueOf(value).setScale(scale, BigDecimal.ROUND_HALF_UP).floatValue();
		return result;
	}

	/**
	 * 使用BigDecimal格式化double小数点位数. 四舍五入的方式
	 *
	 * @param value
	 * @param scale 保留的小数点位数
	 * @return
	 */
	public static double formatDoubleRoundup(double value, int scale) {
		double result = BigDecimal.valueOf(value).setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
		return result;
	}

	/**
	 * 使用BigDecimal格式化float小数点位数. 向下取整
	 *
	 * @param value
	 * @param scale 保留的小数点位数
	 * @return
	 */
	public static float formatFloatRoundFloor(float value, int scale) {
		float result = BigDecimal.valueOf(value).setScale(scale, BigDecimal.ROUND_FLOOR).floatValue();
		return result;
	}

	/**
	 * 使用BigDecimal格式化double小数点位数. 向下取整
	 *
	 * @param value
	 * @param scale 保留的小数点位数
	 * @return
	 */
	public static double formatDoubleRoundFloor(double value, int scale) {
		double result = BigDecimal.valueOf(value).setScale(scale, BigDecimal.ROUND_FLOOR).doubleValue();
		return result;
	}

	/**
	 * 使用BigDecimal格式化float小数点位数. 向上取整
	 *
	 * @param value
	 * @param scale 保留的小数点位数
	 * @return
	 */
	public static float formatFloatRoundCeiling(float value, int scale) {
		float result = BigDecimal.valueOf(value).setScale(scale, BigDecimal.ROUND_CEILING).floatValue();
		return result;
	}

	/**
	 * 使用BigDecimal格式化double小数点位数. 向上取整
	 *
	 * @param value
	 * @param scale 保留的小数点位数
	 * @return
	 */
	public static double formatDoubleRoundCeiling(double value, int scale) {
		double result = BigDecimal.valueOf(value).setScale(scale, BigDecimal.ROUND_CEILING).doubleValue();
		return result;
	}

	/**
	 * 使用BigDecimal格式化float小数点位数. 向上取整
	 *
	 * @param value
	 * @param scale        保留的小数点位数
	 * @param roundingMode BigDecimal中的舍入类型
	 * @return
	 * @see RoundingMode#UP
	 * @see RoundingMode#DOWN
	 * @see RoundingMode#CEILING
	 * @see RoundingMode#FLOOR
	 * @see RoundingMode#HALF_UP
	 * @see RoundingMode#HALF_DOWN
	 * @see RoundingMode#HALF_EVEN
	 * @see RoundingMode#UNNECESSARY
	 */
	public static float formatFloatRound(float value, int scale, RoundingMode roundingMode) {
		float result = BigDecimal.valueOf(value).setScale(scale, roundingMode).floatValue();
		return result;
	}

	/**
	 * 使用BigDecimal格式化double小数点位数. 向上取整
	 *
	 * @param value
	 * @param scale        保留的小数点位数
	 * @param roundingMode BigDecimal中的舍入类型
	 * @return
	 * @see RoundingMode#UP
	 * @see RoundingMode#DOWN
	 * @see RoundingMode#CEILING
	 * @see RoundingMode#FLOOR
	 * @see RoundingMode#HALF_UP
	 * @see RoundingMode#HALF_DOWN
	 * @see RoundingMode#HALF_EVEN
	 * @see RoundingMode#UNNECESSARY
	 */
	public static double formatDoubleRound(double value, int scale, RoundingMode roundingMode) {
		double result = BigDecimal.valueOf(value).setScale(scale, roundingMode).doubleValue();
		return result;
	}

	/**
	 * 简单的格式化float小数点位数. 四舍五入的方式
	 *
	 * @param value
	 * @param scale 保留的小数点位数.必须大于等于1.
	 * @return
	 */
	public static float formatSimpleFloatRoundup(float value, int scale) {
		if (scale < 1) {
			scale = 1;
		}
		int pow = (int) Math.pow(10, scale);
		return Math.round(value * pow) * 1.0f / pow;
	}

	/**
	 * 保留2位小数点, 0也显示,适用于显示价格的float
	 *
	 * @param f
	 * @return
	 */
	public static String formatFloat2_0(float f) {
		DecimalFormat df = new DecimalFormat("0.00");
		return df.format(f);
	}

	/**
	 * 四舍五入, 获取百分比，格式为 23.33%
	 *
	 * @param f
	 * @param scale 保留小数点后几位
	 * @return 格式为 23.33%
	 */
	public static String formatPercent(float f, int scale) {
		return formatPercent(BigDecimal.valueOf(f), scale);
	}

	/**
	 * 四舍五入, 获取百分比，格式为 23.33%
	 *
	 * @param d
	 * @param scale 保留小数点后几位
	 * @return 格式为 23.33%
	 */
	public static String formatPercent(double d, int scale) {
		return formatPercent(BigDecimal.valueOf(d), scale);
	}

	/**
	 * 四舍五入, 获取百分比，格式为 23.33%
	 *
	 * @param d
	 * @param scale 保留小数点后几位
	 * @return 格式为 23.33%
	 */
	public static String formatPercent(BigDecimal d, int scale) {
		if (d == null) d = BigDecimal.ZERO;
		return d.multiply(BigDecimal.valueOf(100)).setScale(scale, BigDecimal.ROUND_HALF_UP).toString() + "%";
	}

	/**
	 * 获取安全的int
	 *
	 * @param i
	 * @return
	 */
	public static int safeInt(Integer i) {
		if (i == null) {
			return 0;
		}
		return i;
	}

	/**
	 * 获取安全的float
	 *
	 * @param f
	 * @return
	 */
	public static float safeFloat(Float f) {
		if (f == null) {
			return 0;
		}
		return f;
	}

	/**
	 * 获取安全的double
	 *
	 * @param d
	 * @return
	 */
	public static double safeDouble(Double d) {
		if (d == null) {
			return 0;
		}
		return d;
	}

	/**
	 * 有任一一个值为0，就返回true
	 *
	 * @param arrayInt
	 * @return
	 */
	public static boolean isAnyZero(Integer... arrayInt) {
		if (arrayInt == null || arrayInt.length == 0) {
			return true;
		}
		for (Integer i : arrayInt) {
			if (safeInt(i) == 0) {
				return true;
			}
		}
		return false;
	}

	/**
	 * 所有的值都不为零，返回true
	 *
	 * @param arrayInt
	 * @return
	 */
	public static boolean isAllNotZero(Integer... arrayInt) {
		if (arrayInt == null || arrayInt.length == 0) {
			return false;
		}
		for (Integer i : arrayInt) {
			if (safeInt(i) == 0) {
				return false;
			}
		}
		return true;
	}

	/**
	 * 判断所有的int都是正数
	 *
	 * @param arrayInt
	 * @return true:都是正数, false:有负数或0
	 */
	public static boolean isAllPositive(Integer... arrayInt) {
		if (arrayInt == null || arrayInt.length == 0) {
			return false;
		}

		for (Integer i : arrayInt) {
			if (safeInt(i) <= 0) {
				return false;
			}
		}
		return true;
	}

	/**
	 * 判断其中是否有负数或0的值.
	 *
	 * @param arrayInt
	 * @return true:有不为正数的值 false:没有
	 */
	public static boolean isNotAllPositive(Integer... arrayInt) {
		return !isAllPositive(arrayInt);
	}

	public static boolean equals(Integer num1, Integer num2) {
		if (num1 == null) return num2 == null;
		return num1.equals(num2);
	}

	public static boolean equals(Float num1, Float num2) {
		if (num1 == null) return num2 == null;
		return num1.equals(num2);
	}

	public static boolean equals(Long num1, Long num2) {
		if (num1 == null) return num2 == null;
		return num1.equals(num2);
	}

	public static boolean equals(Double num1, Double num2) {
		if (num1 == null) return num2 == null;
		return num1.equals(num2);
	}

	public static boolean intIn(int num, int... ints) {
		if (ints == null) return false;
		for (int i = 0; i < ints.length; i++) {
			if (num == ints[i]) {
				return true;
			}
		}
		return false;
	}

	public static boolean intIn(int num, List<Integer> ints) {
		if (ints == null) return false;
		for (int i = 0; i < ints.size(); i++) {
			if (num == ints.get(i)) {
				return true;
			}
		}
		return false;
	}

	/**
	 * 使用bigdecimal 来计算2个double值的相加。因为用纯double直接相加，会有精度问题，比如：
	 * <p> 0.01d + 0.06d = 0.06999999999999999
	 *
	 * @param d1
	 * @param d2
	 * @return
	 */
	public static double addDouble(double d1, double d2) {
		return BigDecimal.valueOf(d1).add(BigDecimal.valueOf(d2)).doubleValue();
	}
}
